package ar.edu.caece.dns.modelo.utils;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;

import org.apache.log4j.Logger;

import ar.edu.caece.dns.modelo.registros.ClaseRegistro;
import ar.edu.caece.dns.modelo.registros.NombreDominio;
import ar.edu.caece.dns.modelo.registros.RegistroRecurso;
import ar.edu.caece.dns.modelo.registros.TiempoVida;
import ar.edu.caece.dns.modelo.registros.TipoRegistro;

/**
 * Esta clase toma un archivo de texto plano y devuelve instancias de
 * RegistroRecurso, seteando los campos con los valores leidos de disco.
 * 
 * <p>
 * El formato de cada linea es el siguiente:<br>
 * <b>nombre dominio, tiempo de vida, tipo registro, clase registro, valor</b>
 * 
 * @author Lucas Jun 20, 2012 - 11:42:40 PM
 */
public class RegistrosLoader {

	private final Logger logger = Logger.getLogger(this.getClass());

	private String path;

	private String fileName;

	public RegistrosLoader() {
		super();
	}

	public RegistrosLoader(String path, String fileName) {
		this.path = path;
		this.fileName = fileName;
	}

	public String getPath() {
		return path;
	}

	public void setPath(String path) {
		this.path = path;
	}

	public String getFileName() {
		return fileName;
	}

	public void setFileName(String fileName) {
		this.fileName = fileName;
	}

	private BufferedReader br;
	private FileReader fr;

	public void init() throws FileNotFoundException {

		fr = new FileReader(path + File.separator + fileName);
		br = new BufferedReader(fr);

	}

	/**
	 * Lee cada linea del archivo creando una instancia de RegistroRecurso con
	 * todos sus valores.
	 * <p>
	 * <b>Formato:</b><br>
	 * NombreDominio;TiempoVida;TipoRegistro;ClaseRegistro;Valor
	 * 
	 * @return
	 * @throws IOException
	 */
	public Collection<RegistroRecurso> cargar() throws IOException {
		logger.debug("Cargando registros de archivo: " + path + File.separator
				+ fileName);

		Collection<RegistroRecurso> registros = new ArrayList<RegistroRecurso>();

		this.init();

		int numeroLinea = 1;
		String line = null;

		NombreDominioParser parser = new NombreDominioParser();

		while ((line = br.readLine()) != null) {

			String[] arr = line.split(";");

			try {
				RegistroRecurso r = new RegistroRecurso();

				NombreDominio nd = parser.parse(arr[0].toLowerCase());
				TiempoVida tv = new TiempoVida(Long.valueOf(arr[1]));
				TipoRegistro tr = TipoRegistro.valueOf(arr[2].toUpperCase());
				ClaseRegistro cr = ClaseRegistro.valueOf(arr[3].toUpperCase());

				r.setNombreDominio(nd);
				r.setTiempoVida(tv);
				r.setTipoRegistro(tr);
				r.setClaseRegistro(cr);
				r.setValor(arr[4].toLowerCase());

				registros.add(r);

			} catch (IndexOutOfBoundsException ioobe) {
				logger.error("Error leyendo linea: " + numeroLinea);
			}

		}

		this.close();

		return registros;
	}

	public void close() throws IOException {

		if (br != null)
			br.close();

		if (fr != null)
			fr.close();

	}

}
